/**
 * request 网络请求工具
 * 更详细的 api 文档: https://github.com/umijs/umi-request
 */
import { extend } from "umi-request";
import { notification } from "antd";
import { Base64 } from "js-base64";
import { getToken, removeAll } from "@/utils/authority";
import { httpChange } from "@/utils/utils.jsx";
import { showFullScreenLoading, tryHideFullScreenLoading } from "@/views/utils/serviceLoading";

const clientId = "sword"; // 客户端id
const clientSecret = "sword_secret"; // 客户端密钥

const codeMessage = {
	200: "服务器成功返回请求的数据。",
	201: "请勿重复操作。",
	202: "一个请求已经进入后台排队（异步任务）。",
	204: "删除数据成功。",
	400: "参数错误",
	401: "用户没有权限或登录超时。",
	403: "用户得到授权，但是访问是被禁止的。",
	404: "发出的请求针对的是不存在的记录，服务器没有进行操作。",
	406: "请求的格式不可得。",
	410: "请求的资源被永久删除，且不会再得到的。",
	422: "当创建一个对象时，发生一个验证错误。",
	500: "服务器发生错误，请检查服务器。",
	502: "网关错误。",
	503: "服务不可用，服务器暂时过载或维护。",
	504: "网关超时。"
};
/**
 * 异常处理程序
 */

const errorHandler = error => {
	const { response } = error;

	if (response && response.status) {
		//需要展示后端自定义的返回信息
		if (
			(response.status >= 200 && response.status < 300) ||
			response.status === 400 ||
			response.status === 404 ||
			response.status === 401 ||
			response.status === 500
		) {
			return response;
		}
		const errorText = codeMessage[response.status] || response.statusText;
		const { status } = response;
		notification.error({
			message: `请求错误 ${status}`,
			description: errorText,
			duration: null
		});
	} else if (!response) {
		notification.error({
			description: "您的网络发生异常，无法连接服务器",
			message: "网络异常",
			duration: null
		});
	}
	return {
		data: null,
		code: response && response.status,
		success: false,
		msg: "请求失败"
	};
};

/**
 * 配置request请求时的默认参数
 */
const request = extend({
	errorHandler,
	// 默认错误处理
	credentials: "include", // 默认请求是否带上cookie
	headers: {
		Authorization: `Basic ${Base64.encode(`${clientId}:${clientSecret}`)}`,
		"Aes-Check": "ok"
	}
});

request.interceptors.request.use((url, options) => {
	showFullScreenLoading(options);
	const token = getToken();

	if (token) {
		options.headers = {
			...options.headers,
			"Blade-Auth": token
		};
	}
	// console.log(url, "url");

	if (!/^(http|https):\/\//.test(url)) {
		url = httpChange(API_SERVER) + url;
	}
	return {
		url,
		options
	};
});

//提前对响应做异常处理
request.interceptors.response.use(async (response, options) => {
	tryHideFullScreenLoading(options);
	try {
		const res = await response.clone().json();
		const { code, msg } = res;
		if (code) {
			if (code == 200) {
				return response;
			}
			if (code > 200 && code < 300) {
				notification.error({
					message: `错误提示 ${code}`,
					description: msg || codeMessage[code],
					duration: null
				});
				return response;
			}
			if (code === 401) {
				if (window.location.hash.endsWith("/user/login")) {
					return false;
				}
				notification.error({
					message: `错误提示 ${code}`,
					description: msg || codeMessage[code],
					duration: null
				});
				removeAll();
				window.location.href = "#/user/login";
			} else {
				notification.error({
					message: `错误提示 ${code}`,
					description: msg || codeMessage[code],
					duration: null
				});
			}
		} else {
			if (response.status == 400 || response.status == 401 || response.status == 500 || response.status == 404) {
				const { error_description, ResponseMsg } = res;
				notification.error({
					message: `错误提示 ${response.status}`,
					description: error_description || ResponseMsg || codeMessage[response.status],
					duration: null
				});
				return response;
			} else {
				return response;
			}
		}
	} catch (err) {
		console.log(err, "err");
	}
	return response;
});

export default request;
